package com.zyx.javademo.bigdecimal;

import org.junit.Test;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author Yaxi.Zhang
 * @since 2021/7/29 13:11
 * desc: BigDecimal案例类
 * @see <a href="https://www.liaoxuefeng.com/wiki/1252599548343744/1279768011997217">BigDecimal</a>
 */
public class BigdecimalTest {

    @Test
    public void testScale() {
        BigDecimal d1 = new BigDecimal("123.45");
        BigDecimal d2 = new BigDecimal("123.4500");
        BigDecimal d3 = new BigDecimal("1234500");
        // 2,两位小数
        System.out.println(d1.scale());
        // 4
        System.out.println(d2.scale());
        // 0
        System.out.println(d3.scale());
    }

    @Test
    public void testStripTrailingZeros() {
        BigDecimal d1 = new BigDecimal("123.4500");
        BigDecimal d2 = d1.stripTrailingZeros();
        // 4
        System.out.println(d1.scale());
        // 2,因为去掉了00
        System.out.println(d2.scale());

        BigDecimal d3 = new BigDecimal("1234500");
        BigDecimal d4 = d3.stripTrailingZeros();
        // 0
        System.out.println(d3.scale());
        // -2
        System.out.println(d4.scale());
    }

    @Test
    public void testRoundingMode() {
        // 可以对一个BigDecimal设置它的scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断
        BigDecimal d1 = new BigDecimal("123.456789");
        // 四舍五入,123.4568
        BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP);
        // 直接截断,123.4567
        BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN);
        System.out.println(d2);
        System.out.println(d3);
    }

    @Test
    public void testDivide() {
        // 对BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断
        BigDecimal d1 = new BigDecimal("123.456");
        BigDecimal d2 = new BigDecimal("23.456789");
        // 保留10位小数并四舍五入
        BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP);
        // 报错：ArithmeticException,因为除不尽
        BigDecimal d4 = d1.divide(d2);
    }

    @Test
    public void testRemainder() {
        // 还可以对BigDecimal做除法的同时求余数
        BigDecimal n = new BigDecimal("12.345");
        BigDecimal m = new BigDecimal("0.12");
        BigDecimal[] dr = n.divideAndRemainder(m);
        // 102
        System.out.println(dr[0]);
        // 0.105
        System.out.println(dr[1]);
        // 调用divideAndRemainder()方法时, 返回的数组包含两个BigDecimal, 分别是商和余数, 其中商总是整数, 余数不会大于除数。
        // 我们可以利用这个方法判断两个BigDecimal是否是整数倍数
        BigDecimal n2 = new BigDecimal("12.75");
        BigDecimal m2 = new BigDecimal("0.15");
        BigDecimal[] dr2 = n2.divideAndRemainder(m2);
        if (dr2[1].signum() == 0) {
            // n是m的整数倍
            System.out.println(n2 + "是" + m2 + "的整数倍.");
        }
    }

    @Test
    public void testCompare() {
        BigDecimal d1 = new BigDecimal("123.456");
        BigDecimal d2 = new BigDecimal("123.45600");
        // false, 因为scale不同
        System.out.println(d1.equals(d2));
        // true, 因为d2去除尾部0后scale变为2
        System.out.println(d1.equals(d2.stripTrailingZeros()));
        // 必须使用compareTo()方法来比较, 它根据两个值的大小分别返回负数、正数和0, 分别表示小于、大于和等于。
        System.out.println(d1.compareTo(d2));
    }
    


}
